package com.smart.community.region.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.smart.community.region.entity.Unit;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 单元楼数据访问接口
 *
 * @author Wu.Liang
 * @since 2024-12-21
 */
@Mapper
public interface UnitMapper extends BaseMapper<Unit> {

    /**
     * 根据单元编码查询单元
     * @param unitCode 单元编码
     * @return 单元实体
     */
    Unit selectByUnitCode(@Param("unitCode") String unitCode);

    /**
     * 根据社区ID查询单元列表
     * @param communityId 社区ID
     * @return 单元列表
     */
    List<Unit> selectByCommunityId(@Param("communityId") Long communityId);

    /**
     * 批量查询单元
     * @param unitIds 单元ID列表
     * @return 单元列表
     */
    List<Unit> selectBatchByIds(@Param("unitIds") List<Long> unitIds);

    /**
     * 根据用户权限查询单元列表
     * @param userId 用户ID
     * @return 有权限的单元列表
     */
    List<Unit> selectByUserPermission(@Param("userId") Long userId);

    /**
     * 检查单元编码是否存在
     * @param unitCode 单元编码
     * @param excludeId 排除的单元ID
     * @return 是否存在
     */
    Boolean existsByUnitCode(@Param("unitCode") String unitCode, @Param("excludeId") Long excludeId);

    /**
     * 批量更新单元状态
     * @param unitIds 单元ID列表
     * @param status 状态
     * @return 更新数量
     */
    Integer batchUpdateStatus(@Param("unitIds") List<Long> unitIds, @Param("status") Integer status);

    /**
     * 批量删除单元
     * @param unitIds 单元ID列表
     * @return 删除数量
     */
    Integer batchDeleteByIds(@Param("unitIds") List<Long> unitIds);

    /**
     * 统计单元数量
     * @param communityId 社区ID（可选）
     * @return 单元数量
     */
    Long countUnits(@Param("communityId") Long communityId);

    /**
     * 根据社区ID和单元名称查询单元
     * @param communityId 社区ID
     * @param unitName 单元名称
     * @return 单元列表
     */
    List<Unit> selectByCommunityIdAndUnitName(@Param("communityId") Long communityId, @Param("unitName") String unitName);

    /**
     * 查询启用的单元列表
     * @param communityId 社区ID
     * @return 启用的单元列表
     */
    List<Unit> selectEnabledUnits(@Param("communityId") Long communityId);

    /**
     * 查询启用的单元列表
     * 单元数据访问接口
     * 分页查询单元列表
     * 根据单元编码查询单元
     * 根据单元名称模糊查询
     * 根据楼栋ID查询单元列表
     * 更新单元统计信息
     * 检查单元编码是否存在
     * 批量更新单元状态
     * 统计楼栋下的单元数量
     * @param buildingId 楼栋ID
     * @param excludeId 排除的单元ID（更新时使用）
     * @param page 分页参数
     * @param status 状态
     * @param unit 查询条件
     * @param unitCode 单元编码
     * @param unitId 单元ID
     * @param unitIds 单元ID列表
     * @param unitName 单元名称
     * @return 单元列表
     * @return 单元数量
     * @return 单元信息
     * @return 分页结果
     * @return 更新数量
     * @return 是否存在
     */
    int checkUnitCodeExists(@Param("unitCode") String unitCode, @Param("excludeId") Long excludeId);
    int countByBuildingId(@Param("buildingId") Long buildingId);
    int updateStatusByIds(@Param("unitIds") List<Long> unitIds, @Param("status") Integer status);
    int updateUnitStats(@Param("unitId") Long unitId);
    IPage<Unit> selectUnitPage(Page<Unit> page, @Param("unit") Unit unit);
    List<Unit> selectByBuildingId(@Param("buildingId") Long buildingId);
    List<Unit> selectByUnitNameLike(@Param("unitName") String unitName);
    List<Unit> selectEnabledUnits();

    /**
     * 批量插入单元
     * @param units 单元列表
     * @return 插入数量
     */
    Integer batchInsert(@Param("units") List<Unit> units);
}
